from django.core.cache import cache
from django.http import JsonResponse
from django.views import View

from apps.areas.models import Area


# 1. 添加查省份数据的类视图
class AreasView(View):
    def get(self, request):
        # 1. 读取缓存中省份数据
        province_list = cache.get('province_list')
        # 2. 如果没有，则去数据库中查询，查完之后把数据放在缓存中
        if not province_list:
            print('执行了一次查询，查询所有省份数据')
            # 2.1. 查询出所有的省份数据： # <QuerySet [<Area: 北京市>, <Area: 天津市>]
            areas = Area.objects.filter(parent=None)
            # areas = Area.objects.filter(parent__isnull=True)
            # 2.2 把数据转换成我们想要形式
            province_list = []
            for area in areas:  # area: <Area: 北京市>
                province_list.append({'id': area.id, 'name': area.name})
            # 2.3 把province_list放到缓存中
            cache.set('province_list', province_list, 7200)
        # 3. 如果有，则直接使用缓存中的数据
        # 4. 返回结果
        return JsonResponse({
            'code': 0,
            'errmsg': '获取地区列表成功',
            'province_list': province_list
        })


# 2. 添加根据省份id查市 和根据 市id查区县的类视图
class SubAreasView(View):
    def get(self, request, id):
        # 1. 读缓存中的数据
        # sub_areas_130000  河北省
        # sub_areas_120000  天津市
        sub_areas_key = 'sub_areas_{}'.format(id)
        sub_data = cache.get(sub_areas_key)
        # 2. 如果没有，则去数据库中查询，查完之后把数据放在缓存中
        if not sub_data:
            print('执行了一次查询，查询了{}的数据'.format(id))
            # 2.1 查询出父级的地区对象
            try:
                parent = Area.objects.get(id=id)
            except Area.DoesNotExist as err:
                return JsonResponse({'code': 400, 'errmsg': '没有该省份或市'})
            # 2.2 查询子级地区对象列表
            # 方式1：
            # sub_areas = Area.objects.filter(parent=parent)
            # print(sub_areas)
            # 方式2：
            sub_areas = parent.subs.all()
            # print(sub_areas)  <QuerySet [<Area: 石家庄市>, <Area: 唐山市>]>
            # 2.3 把子级地区对象转换成想要的格式
            subs = []
            for area in sub_areas:
                subs.append({'id': area.id, 'name': area.name})

            # 2.4 构建sub_data
            sub_data = {
                'id': parent.id,
                'name': parent.name,
                'subs': subs
            }
            # 2.5 把sub_data放到缓存中
            cache.set(sub_areas_key, sub_data, 7200)
        # 3. 如果有，则直接使用缓存中的数据
        # 4. 返回结果
        return JsonResponse({
            'code': 0,
            'errmsg': 'OK',
            'sub_data': sub_data
        })
